<?xml version="1.0"?>
<?xml-stylesheet href="chrome://global/skin" type="text/css"?>
<?xml-stylesheet href="chrome://mochikit/content/tests/SimpleTest/test.css"
                 type="text/css"?>
<?xml-stylesheet href="../treeview.css"
                 type="text/css"?>

<window xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
        title="XUL tree selectable tests">

  <script type="application/javascript"
          src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js" />

  <script type="application/javascript"
          src="../treeview.js" />

  <script type="application/javascript"
          src="../common.js" />
  <script type="application/javascript"
          src="../events.js" />
  <script type="application/javascript"
          src="../role.js" />
  <script type="application/javascript"
          src="../states.js" />
  <script type="application/javascript"
          src="../selectable.js" />

  <script type="application/javascript">
  <![CDATA[
    ////////////////////////////////////////////////////////////////////////////
    // Test

    // gA11yEventDumpID = "debug";

    /**
     * Event queue invoker object to test accessible states for XUL tree
     * accessible.
     */
    function statesChecker(aTreeID, aView)
    {
      this.DOMNode = getNode(aTreeID);
      
      this.invoke = function invoke()
      {
        this.DOMNode.view = aView;
      }
      this.check = function check()
      {
        var tree = getAccessible(this.DOMNode);

        var isTreeMultiSelectable = false;
        var seltype = this.DOMNode.getAttribute("seltype");
        if (seltype != "single" && seltype != "cell" && seltype != "text")
          isTreeMultiSelectable = true;

        // selectAll
        var accSelectable = getAccessible(this.DOMNode,
                                          [nsIAccessibleSelectable]);
        ok(accSelectable, "tree is not selectable!");
        if (accSelectable) {
          is(accSelectable.selectAll(), isTreeMultiSelectable,
             "SelectAll is not correct for seltype: " + seltype);
        }

        var selectedChildren = [];
        if (isTreeMultiSelectable) {
          var rows = tree.children;
          for (var i = 0; i < rows.length; i++) {
          var row = rows.queryElementAt(i, nsIAccessible);
            if (getRole(row) == ROLE_OUTLINEITEM || getRole(row) == ROLE_ROW)
              selectedChildren.push(row);
          }
        }
        testSelectableSelection(accSelectable, selectedChildren,
                                "selectAll test. ");

        // unselectAll
        accSelectable.unselectAll();
        testSelectableSelection(accSelectable, [], "unselectAll test. ");

        // addItemToSelection
        accSelectable.addItemToSelection(1);
        accSelectable.addItemToSelection(3);

        selectedChildren = isTreeMultiSelectable ?
          [ accSelectable.getChildAt(2), accSelectable.getChildAt(4) ] :
          [ accSelectable.getChildAt(2) ];
        testSelectableSelection(accSelectable, selectedChildren,
                                "addItemToSelection test. ");

        // removeItemFromSelection
        accSelectable.removeItemFromSelection(1);

        selectedChildren = isTreeMultiSelectable ?
          [ accSelectable.getChildAt(4) ] : [ ];
        testSelectableSelection(accSelectable, selectedChildren,
                                "removeItemFromSelection test. ");
      }

      this.getID = function getID()
      {
        "tree processor for " + prettyName(aTreeID);
      }
    }

    var gQueue = null;

    function doTest()
    {
      gQueue = new eventQueue(EVENT_REORDER);
      gQueue.push(new statesChecker("tree", new nsTreeTreeView()));
      gQueue.push(new statesChecker("treesingle", new nsTreeTreeView()));
      gQueue.push(new statesChecker("treecell", new nsTreeTreeView()));
      gQueue.push(new statesChecker("treetext", new nsTreeTreeView()));
      gQueue.push(new statesChecker("tabletree", new nsTreeTreeView()));

      gQueue.invoke(); // Will call SimpleTest.finish();
    }

    SimpleTest.waitForExplicitFinish();
    addA11yLoadEvent(doTest);
  ]]>
  </script>

  <hbox flex="1" style="overflow: auto;">
    <body xmlns="http://www.w3.org/1999/xhtml">
      <a target="_blank"
        href="https://bugzilla.mozilla.org/show_bug.cgi?id=523118"
        title="we mistake 'cell' and text' xul tree seltypes for multiselects">
       Mozilla Bug 523118
      </a>
      <a target="_blank"
        href="https://bugzilla.mozilla.org/show_bug.cgi?id=624977"
        title="Optimize nsXulTreeAccessible selectedItems()">
       Mozilla Bug 624977
      </a><br/>
      <p id="display"></p>
      <div id="content" style="display: none">
      </div>
      <pre id="test">
      </pre>
    </body>

    <vbox flex="1">
      <tree id="tree" flex="1">
        <treecols>
          <treecol id="col" flex="1" primary="true" label="column"/>
        </treecols>
        <treechildren/>
      </tree>

      <tree id="treesingle" flex="1" seltype="single">
        <treecols>
          <treecol id="col_single" flex="1" primary="true" label="column"/>
        </treecols>
        <treechildren/>
      </tree>

      <tree id="treecell" flex="1" seltype="cell">
        <treecols>
          <treecol id="col_cell" flex="1" primary="true" label="column"/>
        </treecols>
        <treechildren/>
      </tree>

      <tree id="treetext" flex="1" seltype="text">
        <treecols>
          <treecol id="col_text" flex="1" primary="true" label="column"/>
        </treecols>
        <treechildren/>
      </tree>

      <tree id="tabletree" flex="1" editable="true">
        <treecols>
          <treecol id="tabletree_col1" cycler="true" label="cycler"/>
          <treecol id="tabletree_col2" flex="1" primary="true" label="column1"/>
          <treecol id="tabletree_col3" flex="1" label="column2"/>
          <treecol id="tabletree_col4" flex="1" label="checker"
                   type="checkbox" editable="true"/>
        </treecols>
        <treechildren/>
      </tree>

      <vbox id="debug"/>
    </vbox>
  </hbox>

</window>
